package com.whpost.service.wx.service;

import com.alibaba.fastjson.JSONObject;
import com.whpost.service.dao.t.TApiLogDao;
import com.whpost.service.dao.t.TApiNonceDao;
import com.whpost.service.entity.t.TApiLog;
import com.whpost.service.entity.t.TApiNonce;
import com.whpost.service.entity.tools.ResultInfo;
import com.whpost.service.service.BaseServices;
import com.whpost.service.service.WxBaseServices;
import com.whpost.service.tools.ToolBean;
import jakarta.annotation.Resource;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RestController;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Map;
import java.util.UUID;

/**
 * (WxApiNonce)表服务实现类
 *
 * @author Yin ZhuoYi
 * @since 2020-12-24 10:29:37
 */
@Service
public class WxTApiNonceService extends WxBaseServices<TApiNonceDao, TApiNonce> {
    @Resource
    private TApiLogDao tApiLogDao;

    /**
     *
     * @param loginId
     * @param map
     * @return
     */
    @Transactional
    public ResultInfo getNonce(String loginId, Map<String, Object> map) {
        JSONObject jsonObject = getData(map,loginId);
        if (StringUtils.isEmpty(loginId)){
            return new ResultInfo(500,"用户信息丢失！",null);
        }else{
            String ms="";
            if (jsonObject.containsKey("ms")) {
                ms = jsonObject.getString("ms");
            }
            if (StringUtils.isEmpty(ms))
            {
                return new ResultInfo(500, "Nonce描述缺失！",null);
            }
            ResultInfo resultInfo;
            ToolBean.info("开始获取【"+loginId+"】的【"+ms+"】的nonce");
            //先看有没有，如果过期了，则提示过期了
            String nonce = getMyDao().getNonceByUser(loginId,ms,null);
            ToolBean.info("开始获取【"+loginId+"】的【"+ms+"】的nonce>>>检查有没有存在的:["+nonce+"]");
            if (StringUtils.isEmpty(nonce))
            {
                getMyDao().delNonceByUser(loginId,ms);

                nonce = UUID.randomUUID().toString();
                getMyDao().addNonceByUser(loginId,ms,nonce);
                ToolBean.info("开始获取【"+loginId+"】的【"+ms+"】的nonce>>>重新生成，返回【"+nonce+"】");
                resultInfo = new ResultInfo(200, "操作成功！",nonce);
            }else{
                // 看下有没有使用过，有的话，需要重新生成
                Long id = getMyDao().getNonceFromLog(nonce,loginId,ms);
                ToolBean.info("开始获取【"+loginId+"】的【"+ms+"】的nonce>>>获取到未过期的，需要检查是否使用过");
                if (id!=null)
                {
                    ToolBean.info("开始获取【"+loginId+"】的【"+ms+"】的nonce>>>获取到未过期的，需要检查是否使用过>>>使用过[id:"+id+"]");
                    nonce = UUID.randomUUID().toString();
                    getMyDao().addNonceByUser(loginId,ms,nonce);
                    resultInfo =new ResultInfo(200, "操作成功！",nonce);
                }
                else {ToolBean.info("开始获取【"+loginId+"】的【"+ms+"】的nonce>>>获取到未过期的，需要检查是否使用过>>>未使用过[id:"+id+"]，直接返回["+nonce+"]");resultInfo =new ResultInfo(200, "操作成功！",nonce);}

            }
            return backRtn(resultInfo,loginId);
        }
    }

    @Transactional
    public ResultInfo checkNonce(String ms, String czy_id, String nonce, String apims) {
        ToolBean.info("checkNonce【"+czy_id+"】的【"+ms+"】的nonce【"+nonce+"】开始...");
        // 看一下，这个nonce是不是没有过期
        String nonce1 = getMyDao().getNonceByUser(czy_id,ms,nonce);
        ToolBean.info("checkNonce【"+czy_id+"】的【"+ms+"】的nonce【"+nonce+"】开始...取出的nonce["+nonce1+"]");
        if (nonce.equals(nonce1))
        {
            //说明没有过期，需要校验是不是重复提交的
            Long id = getMyDao().getNonceFromLog(nonce,czy_id,ms);
            // 找到了，所以属于重复提交
            if (id!=null)
            {
                return new ResultInfo(4, "请不要重复提交！", null);
            }
            else  {
                // 写一个日志，然后返回
                TApiLog wxApiLog = new TApiLog();
                wxApiLog.setCzyId(Long.parseLong(czy_id));
                wxApiLog.setApims(apims);
                wxApiLog.setMs(ms);
                wxApiLog.setNonce(nonce);
                SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
                try {
                    wxApiLog.setCreateDate(df.parse(getMyDao().getRealSysdate()));
                    wxApiLog.setEndDate(ToolBean.getDayAddDates(df.parse(getMyDao().getRealSysdate()),1));
                } catch (ParseException e) {
                    throw new RuntimeException(e);
                }
                tApiLogDao.insert(wxApiLog);

                // 删除这个Nonce
                ToolBean.info("准备删除【"+czy_id+"】的【"+ms+"】的nonce【"+nonce+"】开始...");
                int sl = getMyDao().delNonce(czy_id,ms,nonce);
                ToolBean.info("准备删除【"+czy_id+"】的【"+ms+"】的nonce【"+nonce+"】结束...删除数量["+sl+"]");
                return new ResultInfo(200, "OK", null);
            }
        }else{
            return new ResultInfo(5, "没有合法的凭证或者凭证过期！", null);
        }
    }
}